package com.chenu.gamscriptman.domain;

import com.baomidou.mybatisplus.annotation.FieldStrategy;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import lombok.experimental.Accessors;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

/**
 * @author flyan
 * date 2019-12-24
 * @function Bean，对应表中的user表，用于记录一个用户信息
 */
@Setter
@ToString
@Accessors(chain = true)
public class User implements UserDetails {

    @Getter
    @TableId(type = IdType.AUTO, value = "uid")
    private Long uid;                /* 用户号 */

    @Getter
    @TableField(value = "username", insertStrategy = FieldStrategy.NOT_NULL)
    private String username;            /* 用户名称 */

    @Getter
    @TableField(value = "password", insertStrategy = FieldStrategy.NOT_NULL)
    private String password;            /* 加密密码 */

    @Getter
    @TableField(value = "role", insertStrategy = FieldStrategy.NOT_NULL)
    private Integer role;               /* 用户角色 */

    @Getter
    @TableField(value = "uinfo_fk", insertStrategy = FieldStrategy.NOT_NULL)
    private Long uinfoFk;            /* 用户信息外键 */

    @Getter
    @TableField(value = "expired", insertStrategy = FieldStrategy.NOT_NULL)
    private Boolean expired;            /* 账户过期情况，true过期。 */

    @Getter
    @TableField(value = "locked", insertStrategy = FieldStrategy.NOT_NULL)
    private Boolean locked;             /* 账户冻结情况，true冻结。 */

    @Getter
    @TableField(value = "credentia_expired", insertStrategy = FieldStrategy.NOT_NULL)
    private Boolean credentiaExpired;   /* 账户密码过期情况，true过期。 */

    /* 不知道什么原因，即使这个字段设置了默认值，依旧不能给null，所以前往别给null */
    @TableField(value = "enabled", insertStrategy = FieldStrategy.NOT_NULL)
    private Boolean enabled;            /* 账户可用情况，true可用。 */

    /* 角色集合，这个属性不在表中 */
    @TableField(exist = false)
    @JsonIgnore
    private Collection<GrantedAuthority> authorities;

    /* 外键映射 */
    @Getter
    @TableField(exist = false)
    private UInfo uinfo;

    /* 一些常用字段 */
    public static final int ROOT = 0;       /* 超级用户 */
    public static final int ADMIN = 1;      /* 管理员 */
    public static final int CONSUME = 2;    /* 消费用户 */

    /* 返回账户的角色集合，一般由role指定，但可以在用户添加到系统后根据情况添加一些特殊的角色 */
    @Override
    @JsonIgnore
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return authorities;
    }

    /* 账户是否没有过期？ */
    @Override
    @JsonIgnore
    public boolean isAccountNonExpired() {
        return !expired;
    }

    /* 帐户是否没有冻结 */
    @Override
    @JsonIgnore
    public boolean isAccountNonLocked() {
        return !locked;
    }

    /* 密码是否没有过期，一般有的密码要求性高的系统会使用到，比较每隔一段时间就要求用户重置密码 */
    @Override
    @JsonIgnore
    public boolean isCredentialsNonExpired() {
        return !credentiaExpired;
    }

    /* 帐号是否可用 */
    @Override
    public boolean isEnabled() {
        if(enabled == null) setEnabled(true);   /* 解决为null */
        return enabled;
    }

}